{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 复正弦信号、实数信号的DFT\n",
    "\n",
    "本文将介绍复正弦信号和实数信号的DFT性质，内容包括：\n",
    "1. 复正弦信号的定义以及DFT性质\n",
    "2. 实数信号的定义以及性质\n",
    "3. 代码实例"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 复正弦信号\n",
    "\n",
    "首先说明，复正弦信号只是一种数学定义上的信号，在实际生活中没有发现过这种信号\n",
    "\n",
    "我们先来看一种较为简单且比较有规律的复正弦信号，它的定义如下：\n",
    "\n",
    "$$\n",
    "x_1[n] = e^{j2\\pi k_0 n / N} \\\\\n",
    "\\text{n=0,1,2,...,N-1}\n",
    "$$\n",
    "\n",
    "其中，$e$是自然常熟，N表示信号的个数。\n",
    "\n",
    "至于$k_0$，它是很关键的一个参数，我们可以将它理解为$x_1[n]$信号的周期个数。通常我们只能对一小段信号做DFT，因此需要先对信号截断，如果截断的信号刚好是整数周期，即$k_0$是一个整数，那么信号不发生泄露；相反，如果截断信号不是整数周期，即$k_0$是一个浮点数，那么发现信号泄露。\n",
    "\n",
    "关于信号泄露，请参看这篇文章 [什么是泄露](https://mp.weixin.qq.com/s?__biz=MzI5NTM0MTQwNA==&mid=2247484164&idx=1&sn=fdaf2164306a9ca4166c2aa8713cacc5&scene=21#wechat_redirect)\n",
    "\n",
    "## 复正弦信号的DFT\n",
    "\n",
    "将复正弦信号的定义直接套上DFT的公式可以推出其DFT形式：\n",
    "$$\n",
    "\\begin{array}{l}\n",
    "X_1[k] &= \\sum_{n=0}^{N-1} x_1[n] e^{-j2\\pi k n / N} \\\\\n",
    "       &= \\sum_{n=0}^{N-1} e^{j2\\pi k_0 n / N}e^{-j2\\pi k n / N} \\\\\n",
    "       &= \\sum_{n=0}^{N-1} e^{j2\\pi(k_0 - k)n / N}\\\\\n",
    "\\end{array}\\tag{1}\n",
    "$$\n",
    "\n",
    "当 $k_0 = k$ 时，$e^{j2\\pi(k_0 - k)n / N} = e^{0} = 1$，因此 \n",
    "$$X_1[k] = \\sum_{n=0}^{N-1} 1 = N, \\text{if } k_0=k$$\n",
    "\n",
    "当 $k_0 \\neq k$ 时，利用等比数列求和公式可得\n",
    "$$ \n",
    "\\begin{array}{l}\n",
    "X_1[k] &= \\frac{1-e^{j2\\pi(k_0 - k)n}}{1-e^{j2\\pi(k_0 - k)n/N}} \\\\\n",
    "       &= 0\n",
    "\\end{array}\n",
    "$$\n",
    "\n",
    "\n",
    "即\n",
    "$$\n",
    "X_1[k] = \n",
    "                        \\begin{cases} \n",
    "                         N, & \\text{if $k_0 = k$ } \\\\ \n",
    "                         0, & \\text{if $k_0 \\neq k$} \n",
    "                        \\end{cases}\n",
    "$$\n",
    "\n",
    "这里仔细说明下$X_1[0] = 0$是怎么来的\n",
    "\n",
    "1. $k_0$和$k$都是整数，那他们的差$k_0-k$也是整数\n",
    "2. 当N是整数时，$e^{j2\\pi N} = 0$，因此$1-e^{j2\\pi(k_0 - k)n} = 0$\n",
    "3. 根据1,2，推出$X_1[0] = 0$\n",
    "\n",
    "等比数列求和的推导，可以参考这个公式:\n",
    "$$\n",
    "\\sum_{k=0}^{N} z^k = \n",
    "                        \\begin{cases} \n",
    "                        \\frac{1-z^{N+1}}{1-z}, & \\text{if $z\\neq 1$ } \\\\ \n",
    "                         N, & \\text{if $z = 1$} \n",
    "                        \\end{cases}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 复正弦信号DFT实例\n",
    "\n",
    "我们将通过代码来展示复正弦信号的性质，首先生成一段复正弦信号，然后进行DFT，画出结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "import 需要的包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from scipy.fftpack import fft\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义生成复正弦信号的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def generate_complex_signal(num_sample, k0):\n",
    "    '''\n",
    "    generate a complex signal\n",
    "    \n",
    "    num_sample : 信号的个数，即公式中的N\n",
    "    k0 : 周期个数\n",
    "    \n",
    "    returns\n",
    "    x : 复正弦信号\n",
    "    '''\n",
    "    \n",
    "    n = np.arange(num_sample)\n",
    "    x = np.exp(1j*2*np.pi*k0*n/num_sample)\n",
    "    \n",
    "    return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "生成信号，进行DFT，画出结果\n",
    "\n",
    "当k0是整数时，DFT后的结果与预期的一致"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl8AAAFpCAYAAACidE0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzsvXuQZFd5J/g7+a5HZj+rWkICJGyBjcEP3MPgx/qFJwLmYRFhvDaxG9aweBWz61l7PfvCs7Pj2ImdCHtjdtlxrAOPDLZF7IwNw2BbO8vaZjATeBYQtBAghMASAkmNpKrqVndnVlW+8+wf556bt7Lu4zy+cys7+/tFdFRXVmZ+99x7vvO9fuc7QkoJBoPBYDAYDEY5qJz0BTAYDAaDwWDcSmDni8FgMBgMBqNEsPPFYDAYDAaDUSLY+WIwGAwGg8EoEex8MRgMBoPBYJQIdr4YDAaDwWAwSgQ7XwwGg8FgMBglgp0vBoPBYDAYjBLBzheDwWAwGAxGiWDni8FgMBgMBqNE1E76ArJw/vx5edddd530ZTAYDAaDwWAU4pFHHrkipdwyee/SOl933XUXLl26dNKXwWAwGAwGg1EIIcQzpu8lKTsKIX5XCLErhPhyxt+FEOI3hRBPCSG+JIR4A4VcBoPBYDAYjJsNVJyv3wfwlpy/vxXAPdG/+wG8l0gug8FgMBgMxk0FEudLSvlJAC/lvOVeAB+QCp8BcFoIcTuFbAaDwWAwGIybCWXtdrwDwHOJ3y9Hr50YpJR46IvP49FnrwWVM51JfObpq0FlAMDz1/v45pWD4HI+/+w1DMbToDIOhhN84bnrQWUAwNf39rHTHQSVIaXEp79+FbOZDCrnyv4QX3uxF1QGAHz5Wzdwoz8OKmM8neGz38iL5Wjw3EuHePbqYXA5l775EkaTWVAZ3cEYj12+EVQGADy508NurxydkTKszux2B3hqN7zOfOnydewPJ0FlDMZTPPJMeJ155uoBLl8LrzMPP30Vk2lYnTlplOV8iZTXjmmWEOJ+IcQlIcSlvb29sBckBP7RHz2GP3r0W0HlfPyJHfzcA5/BV1/sBpXzaw89jl/6w0eDyri6P8Tb3/sp/OtHLgeV868efhZvf++n0BuENfL/xf/1CP6X/+eJoDK+ePkG3vE7n8H/9/UrQeW852N/hft+97NBZUxnEm//7U/hfX/5dFA5H33sBfzH/+LTwR2jX/3IY/jvPvzFoDKev97H23/703joi88HlfN7/+Gb+Onf/lRwJ++dv/85/G9/9ldBZXzm6Zfwjt/5DB55Jmxg/Ov/71fxn3/gkaAy+qMpfvq9n8IHPv3NoHL++NFv4e2//engweSvfPAL+Ed/nErtJsPX9/bxsw98Bn/+lZ2gck4aZTlflwG8PPH7nQCOrUZSygeklBellBe3tox2a3rhQqeF3e4wqIzL1/oAgG9FP0PKuRxYxgs3BphJBI98Ll87xGQmsRPw2Ugpo3sWfizqZ/jn/2J3ENT4Xj0YYjCelTIWALh8PfyzCT2Wb13vx7JC4vK1Q4wmM1zZD6cz05nE89f7pTwX9bOMNfMwaIZttzfAeCpLGYuUytkPLac0/S8hw3aSKMv5egjAz0e7Ht8E4IaU8oWSZGdiu9PETuAUuv7+kI4EoFLoLx2MghpfHVWFdlj1vdoNGMXtDyc4HE1LG0voiFR//15A47tb8lhCPhsplXO/1xsGNb56LKH1f6cX/tlc3R9iJktYy0oYC6DW5vFU4tphuAx7GWuZkhN+nk1nElf2h6Xpf+h5dtKgajXxBwA+DeA1QojLQoh3CSH+nhDi70Vv+SiApwE8BeB3APyXFHJ9caEdPvO1p5UvoJM3ns5w9WCk5IU0vr3wY0l+v5YXRsZ8LKEj36S8UNjrhV/kyxrLbgk6sz+coD+eYjSd4XpA46vHshdaZ7ol6kxg41vGWKSUpcyz0nSmF36eaee7N5igPwrH+43XssD37KRB0mRVSvmOgr9LAL9IIYsSW51mHPkKkUZL80cZma+9xCTd6Q5wx+m1IHJKi+JLyLDo79aR79mNRhA5uyVEvqPJ3PkO+WxKy+KVoDPJ797pDXAm0PMvLfNdgmOkn3t3MMFgPEWrXg0kJ/w860XOt5b3HbeFkVN25rssndntDfDKcxuB5AyO/FxV3NJnO15ot1Yi8k1GCCEzeWUs8FLKUiKfpMN6s0e+SZ5P0HkWza3Qke88IxFyLs/vU0idKSPzPZrM8FLkfJeR+QJCrzMlZPGSjkQJ2eIr+yNMA+543iuhKnFEZ0p4Nnsrnvm6pZ2v7U4TAILyvsqJSJJKEdL4Ho18Q+D64RijaItxGZkv9f+bO1tU2lh64edZ0vkOec+Sxjfos4nu015vGMz4JqkGpc2zoGtmCSX0brmOxHQmcfUgjJyyM9/q/+F1hjNfK4wLnRaAcFHcYDxFd6D6u4SNSMrNfIWUc0TGKkS+3fCR725ZWbxu+GeTdL5DRr5lR/EziWDGtzRHogT9X8x8h+JjHh1LSdmiQPcsmflehWyx/u7D0TR4f7STxC3tfG23o8xXIOXTk+i2Tito5LvbHaAigPObzeCR722Rwxoq8tXXf1unFZa/0hviQpT5DLVgaef7tk4raOS7m7hnISPf3V7i+Qd6NnpeqbGEza6s1atot2rBeVK3BQ7ydhLrTNDn3w3//LXzfVunFdT47pSkMzvd4fz53+xrZneIsxsN1Ksi2Pqvne/Q82wZcIs7X1opQmVx1MR53R2nAke+Q5zfbOJlp1vBxqK2GY/wujtOxTJDQF//6+44FTby7Q7wyrMb6AQ0vvoelXHPKgL4ztvbwbM4wceSuGchje9u5Hxf6ITTGe18x/cskMHaS6wzobmlr76tjXpVBFwzF3QmoJz1RhV3n98ITtUoc828ejDCOFBn+L3eABc6LWy3WzGXkRra+Q59z5YBt7TztdYIG/nqiOr1gSfSTm+A7U4T2+1wma+rBypzp8cSLPPR1YakE9z4bnWa2A4Y+ero8PWBje9Od4Dzm03cdmot2FyeziT29od49YVNNKqV4JnPMubZdrsVVGd2F/Q/2DzrKuf7tbe3cWU/nPHd6Q5wod3EdjtchqXc59/EhU4z2HPRzvd3vawTyQyb+db3LFS5fqc7xHa7ia12uP6YZa2Zy4Bb2vkCEDTy1RPn9Xd2jvxOLqc7xIV2C9tReTOUDAB4zW2bQSPfvd4Q7VYNd0XbmIM9m+4AF9otXOg0gz4XIPH8A0a+FzpqLKEi35cOFGfttlMtbLWbwSLfeRQf9p7t9YbYDpz50vNKG99wz3+ArbZyvgEE6XKvM98XOi1sd5rBM19aZ4KtZ70htjstXIjWzBAZdv287zyzhrMbjXDrTCLzrX8PI2cQZYubwTPfodfMZcAt73xtt8MuJPWqwKsvREoRcPHVma9QxlcvgttR2jncQqIiUs3HC3HP9ocTHIym0T0rw/iGzXzsRhGpLqOHML56LNvtZlDjq53vV55bPyKXGruJzFeo8ra+R3eUYHz1WIAw80w733qdCan/APC6l4WtFuz15lmc0XQW5LD4WGc6rbB2JqKd3B453yGyktr5VvMs5JqpvvfbtjbRqlc487XKuBCQ2DsvbWjyIP2E1d3tt9utePdmiGhR36M48g1YQlEywpFUd+OxNOOxhDC+O13lfG+3m4GN7yCK4sMZX/28tzstXGiH1Zkjzz+g830hKjuPJmGM7xGdaYcrbymdaSZ2b9M/Gz0Wvc6EDCTarRq22k2s1avB59mFTri1WX+nnmfBSrW9QZz5Vr/Tj0XTTnTm60Z/HKTdUFnzbBlwyztfISPfvd4QW+0mGrVKMON7ZX8IKRFHpECYtLP+zq3N8JGvzq4AYYyvHot2jENGvtvtFoQQwYzv3PmeZ75CLPJlZb52o4xEu1lDq14JYnz1/SlDZ+pVgTPr9YgSEI5wv9VuJfoW0o9lnvlW9yyU8dX6L4QINs/0ua5HMuwhgrze3JEInfnabjdxbrOJigD2guhMtP4nkgkhgnyd+V5rVIPamWUAO1+BI1+t3KGMr1aKC0cybGEi3zPrdTRqlWARiT7seLvTCmp8d5KZr4Clmt2ucr4BBDO+R5zvgMZ3J158wxpfrTNCiGB8LD2Wo6W6MPOsDOdblYOaOLfRCGZ85xmJZlDjqzPfWlZI/d9OZAtDZb5i57utjrKbBWg3pDPf1YrAuc1AdqaXCFg6oXVG28zwZy+fJNj5Chz5xgtJION7dCEpaSyBjG+3P8FoMgtufLXR2EqUakNFvvqZlOF8hzS+uz3lfDdr1bgkSG18pZTH5lmQzFdv7nyHbLSsM99a1t4+vfHV/L4LnRZq1UpA45twvjths0XbRwKWwAFr8LG04rVsMpN46XBEKiOZ+QYQbANRfM868yA/vM0Mly1cBtzyztc88qGdsIPxFNcPx+EzX725Uui0c5CyU3dwJIsD0BvfnQRBFQgb+bbqFXRataCZL7U1W40llPFNOt8hje9iRiIpmwo3+mOMJrOFbGE443u0VBdmns2db91ol9b4zrN4YY2vznw3a9VgHFad+S7L+d7uNLHeqKHdrIWhNyQz34F0Rme+5/csTFUiznxvzoP8MjJf+8MJDla0y/0t73yF2lW3l3CK1M8wxne3O4AQwLmNBqoVgfObYcjwixkJ9Rqt8s0j0sDGN9odpnkl6jV65/tGfxzc+O6mzLMwUXwyixMm8l0cS0jjq53voMa3d9T51rJJZSRI/UA445vU/3gsxM9GZ76T8+wgQK+/5OYRANgKpjMJ5zuUzqQ632HKjmc3GmjUKjiz3kCtQt9uaDHzHfoEkpMGO1+BIl+tzFslGN/zmyrrAajxUI9lNpPx1mwgmS0kznx1y8t8acUOZXxjgnIJxlc731pemPLmIHjmK8krAsIZX52RFEIACGN8deZbP/etdpjypub36XUsmPFNZL618aXmFu70Fh3JME6ezny3mzUlL2C2SOt/yLEA83u21W7h6sEQE+J2Q7rBKgBUKiLI2nws8x2Qw7wMuOWdr1DGN8krAMIZ32SaVsujHstLhyNMZjL4ojjfhRg48k1kJADNLQjjfG8HNr6LzncI47vofJ9ZbwRptJvklQAh59nc+QbC6ExZzvdedK6rdr5DGd9kRkIb31Br5mKQFyLDeqEzd75D6P+xzHeg3du7Kc63lMCVfdogfy8i9WtsBahKpGXxk6+vGm555wsIo3xJLg4Q1vhe6IR1JBYzEtr4kke+3QE2mzVsRBFpMOPbHcbPRcmhj3yTO+qA8pzvEMZ30fmuVAS2AhzivrPgsAYzvt3jzneozPdc/8NwC3e6Q5xbcL6pje+i8w0o4xtqnSkjw3okYI12b1O2G1p0vpu1Kk6v1+nn2YLzHSpblMx8AYoaEjrzHbJ1zjKAnS+E2dK62xuiVhE4u66UIpzxPaoU2+0WeZf7eXR11PiGyBYknaIQxvdgOMH+cHLE+IbgSSUbuQLhjO+i8x3C+C5mJIAwfLzd7hDtpuJhJeVRL/K7KfOMutHubve48T2zXg+SYb2wEEgAtPds0fkGlPENncUJtbFnLzpaSGO73cRoMkO3T5dhX3S+gTAZ1t3ecedbv06FWXSu65F5FiDDvpj57qzV0KxVOPO1yrgQIPLdiXa6VCoRrySA8Z1MZ7h6sLCQxMaXTs7uQkSi5ISJfI86kvTGd57aPjoW6sh3J3K+z0TOdyjjm+Z8q9fp5CzuQlVy6CPf3d4g5kgm5VEa3zTne7vdxJDY+O4sON9KTpgM62IgAdAa38WMBBAmW7jTHRxxvjstZXxDZ770PKMcz2LmW8lpBqkWhHa+r+qjpZLzrN3C9UPadkOLmW+9IYo5XyuM7RCR70KNPITxvbI/Ug02FzhfAG15c7476KhjFL6ESm98545k4Mg3coq0861lhna+QxjfvZTMV4gebPqAeI0QxjfL+VZ/o5WTdL6VnADZgt4wuPFdzHwDc+M7nNAZ373e8IjzHaLX3/xoqaP6D1CvmenON3UPvkX+6vnNBoSg1f9kXzwNbQto1+ajmW8gTLZwWcDOF8JEvrsLGQklh9b4zpXiaHQF0Gc+Tkc9fjQudFqkkaLq8XM0Ig1hfHdyjC/leFQWp3XkNWrjm+Z8B8l8dY+XULbbzSCR73Zg47uT4Xyrv1HKSXe+Kfkr2vneCm18MzJf6m+0zybpfGuZpI5kylhC9HpczHwDc/2nbDekz/XUqFUrOLfRJJ1nyb54GmEClqOZbyWHPsO6LGDnC+Em0oWUiURrSNIzEko+bUSStihSRr7dwQTDyeyIIxnC+KZlvi4EiXyH8fdqUBvfNOc7TOQ7THW+AbrIV0qp7tmiw0ptfFOc7xCnHKQ53xc6tEfMaOe7LOO7nZotpJ1n2wtrJrn+L+yoA5J9C2n1f9H5vtBuYjKTuEbU5T7N+QbodzynZr6CrZmL+t+KM++rBna+MDe+VJHvcDLFtcPxEQMPlGN8z21Expc4iktbFAE65dPXu3XMYaE3vs1aBZ21eWp7O0jkO0i5Z7TGN835DmF80zISW3F5k0ZOt6+c78VscRnOd4jMV7rz3SQ9YiYtiwfQG9+0zDf1TmSd+V50vreI6Q1p/LWNZg2bzRrxOpOW+abtj5jmfAP0a2byXFeNMNnC42vmdqeJ3nCCw9Hqdbln5wv0ma+9lOha/05tfIVQ2Q6NWrWiutyTcn4Gxxb4ufElcr5SIlL9O7Xx3e404x4/AH3kO5xEDTZTsoWUxjfN+Va/U0e+Kc43MbdwN4XUD9Ab3zTnWxtf6sxX8IAlY52hL9Udz0hQZ9h15jvN+aY8YiZuAZGSYaXmLy0639Q73mOdSXk21JmvMwvO91niLvdZme8QHOZlATtfoI9803a6aDmUxnevN8C5jfk246QcqsV3NpMFxpdGTlpECoSIfI8bEurIN61MA9Ab3zTnGwjDkzk2l4m5hWlZPIDe+O6kON9aLtVz0ZnvY8438Wka2ZkvYp5civ5r40unM+nON3VgtNMdKOe7VTvyOvWuutQsDrEjoXUmzfm+sk/X629xRy0QtRsiPK84K/MdgsO8LGDnC/SR715KjxcgjPFdnKxaDtVidU33+MlQCurM1+LiS2180zISSi5d5Js1Fmrjm+V8Uz5/3eMny/jSPf/0LB618U3L4gCaj0mb+c4yvlQclt1etvNNaXzTMt/a+JLrf4rzDdAFeYvd7TW223Q6k5X53mqXk/na7rQgJciOsksLvpVcOp3JynyHarS8DGDnK8J2hy7yzcx8ERvfNFK/kksXkcRjWVAK6sh3pzvARqOKzeZCRBrA+C4+Fy2HPIpPIdwDdMY3y/mmNL7XDkcYT48739SRb17mCyDMsGY534Q7kbN0Zt7rj26epWa+CY1vVuYboNWZxe72sYx4zaTLfKUHrGosFO2GsjLfrXoVp9bqpPMsy/lWf6ebZ6lrZoeuDUSW/odqtLwMYOcrArUXX62I+MiHuYwQxjddKaiOmEnb6QKEiXwXF14ll874Ho4m6A0nqYaEMluUxV8jN75Zzjeh8c3K4unXKHUmebTUXAat8d3L0Bl9ygGF8Y0z3+3jxvf0ep1YZ9KdIoBmnmVlvgGQnnKQmfkipjdkrTPb7ZZqNzTwz7Dn6QzlaRp5mW+ApsKij5bKmmfUma/FZ3NqrY5GrUJ+ysEygJ2vCPp8LwrsdIfY2jy6zRigNb6T6QxX97OVguqImcVjUo7I6bRIo6vFnY5KBp3xXTzs/IicNl3ku9MdHDlaSoPa+GY634TzLK1Te1IO3W7XjBI6ofHNc7632y0MxjTGd87FCZthzc7i0BnfrCweQD+WNOe7s1ZDg/CImd3o5JFFzPuW+Y8nK/OtXqO1M+nBF12FRR8tlTXPrhG1G8rKfAkhgpymsQwgcb6EEG8RQnxNCPGUEOLdKX//u0KIPSHEF6J/v0AhlxLaiydJO2dECpTG9+rBCDOJY9uZAdq+Rfo7Uhcswh1CmZkvQuO7eHbcETkd2sg3ebRUElQLyXQmM51vSuM7z0iEjeKzuHiUxjfX+Y47dtPoTJrzDdBnWFMdPELjm5X5Vq8p4zuaUGTY051v1euPpnXK4UgdLZWV+dLX4YuszDdAzS1Nd77PbzajdkOEOpPhfAM0vf6yMt9aNnO+UiCEqAL4LQBvBfBaAO8QQrw25a0flFJ+b/Tvfb5yqXGhoyLfHgGxW2Vxjk9WgC5VOzck2WUHKuN7aq2OVr167G9ULQ30NuO0hUQbXyoFB9IXkq02pfFNH4uWTeJ87w8znW/KzRD6vqc733SR7+IxKRqUxjfP+abciaazK2nO9xZRwKIz38GNb47zHRtfgnNk97rpvDItm9L5zuJ8AXQBa5bzrcZCxy1LW8vq1QrObTSIHMn0zWMALRk+b83cJqS3LBMoMl9vBPCUlPJpKeUIwB8CuJfge0tFvBOFaJHPW0go0s7zI1/CRr5ZpQ1AjeWlg5F35NsbTtAfT1PvGWXaOSu1rV6ja4CY53yr1hlhx6KNL1XZMcv5pop8046WOiqHWGdyMl8kOpNrSGiMb17me2586UpouZQAinnWSyd1A3TZ4rRjsmIZhA1Qd7pDnE+hnQBqLOOpxLXDsZeM6UziSobzDaijgGhKqNnON6nNzKCdKNlcdszCHQCeS/x+OXptET8thPiSEOLDQoiXE8glBVWpZjSZ4aWDUWppA6BLO2c1WAToI9+06Cop2zfyzUtt69eporhGrYJTa/UUGZSRb3o5UMlpYW/fv9FuXhaPNPLN4JUkZfvK6Q0nGIxnufOM6rno7zsugzLzNUgNirRsCuObl/kGIicvcOabKls4b7AZNlucVw7cbNaw0agSrplFOuM3n3XmO2+eUWa+0hwj6sxXlv5vd1roDSboj+jOkV0GUDhfx917YNGy/N8A7pJSfjeAfwfgwdQvEuJ+IcQlIcSlvb09gkszR0xS9lQK7Yjkp9D9I9+d7iDaZnxcDm3kmx/F62vxk5Gt4EoOTeSjx7LY4wegi3y1850XxSvj67cZIi/zBdBFvnkZCarIdzcnIwEQOhLdbOd7s1nDeqNKk/ksyHwB/jqTl/lWr9McSJybkSQKWOLMd848ozC+WY2cNbY7LRqeXB7tJM4W+s2zIv2nrBZkOd/nNhqoErQbKs580/ZHWxZQOF+XASQzWXcCeD75BinlVSmlnm2/A+D7075ISvmAlPKilPLi1tYWwaWZY5so8tWGJDvyIYp8e0Oc22igXk1/hBQGS0oZEaHzFxLve5YTkerXqaK4LBlUka92vkNni/IiUi2fKvOV5RSRjSWntAGA7Hw37RSlOd+Anmd+C3yc+S7IFvs//4J5Rpj5yhrLuY0mqhVBsGbmB6xU2aK93jDT+QaiDUShM19EG4jyMt/69Sv7Q0wJMuxZY6lUBLY2/Xc8F2e+V7PRKoXz9TkA9wgh7hZCNAD8HICHkm8QQtye+PWnADxBIJcU2vjSRSRZmQ+6bFFWdAXQRL7XDscYT9O3GQPJHUJEUXxmFocq8s3OSAA0kW8erwSgawOx0y1yvv0jXylVj5+suUwV+e7kkHoBuvJWXnQN0BxlFWe+S8h8ZWW+AXUvSYxvjs5UKwLnNxtkme+8bDFAkS0a5DrfFPpfmPkmcr53ChzW7XYTM6nKk75yssai5fu2ASrMfK/oEUPezpeUcgLg7wP4Myin6kNSyseFEP9ECPFT0dt+SQjxuBDiiwB+CcDf9ZUbAhSRb9bRQnMZdJFvVkQC0ES+RdGVNr4Uma/1lO72GlSR7243O/MF0ES+RVkcqihuLycjqeX4Gt/rh2OMprPgkW8x549SZ/LvGcUc09+VhnlLC/+x5DrfnZa38S3KfAM0WenCLB6V/hc9/8j59qGEFGW+W/UqOq0aSeYr3/mmWmeyM9+ArrD46kzBmrmih2uT9PmSUn5USvlqKeW3SSn/afTaP5ZSPhT9/1ellN8lpfweKeWPSym/SiGXGhSR7053iIpQKfk0UEa++Vkc/8i3KLrSxpdqLJkRKUHkOxhP0R1MMst0AE3km7c1G6DjSRVm8Qgi3zgjFTjy3enmO9+l6Ux0XJKP8dVzNGueaeMbPPNNoDNFmW8tJzh/jTjzlYXtThP98dSr3VBR5lv9zX/3rknmO3k9Loid7wL9987iFayZp9fraFQrZMfyLQu4w30CJJFvT22ZraZsMwZoIl+9zTg3i0MQ+cZRfI7yUXCLVGuO/Ohavc/92RRlVwCayHe3O4yOlso2vqfW/Bvt5nExAJrId37PAke+OVy8pHyfsfRHU/QGk4J5pozvvofx3SvIFuu/UWSLczPfFDpjMBaKI4Z2e8PUc101tPENnvki4P0WZXGUHP/du3sFThFFhl0730UVFt92Q0VrsxDqKDuqY/mWBex8JUAV+eYpBUXkG28zLohI9fW4Iq8ppcZW2/+IoV2DjATgN5Z5Fid85Ht+s5HpfOtr8Lln01k+F0vL0Nfjiry+WLEcCuc748gXDX2+m4+Tt2vy/Al6ve3EzvfxBpuxHAI+pkkWT1+Pu4xi/d9uN3HV0/ju5LTmAObG18cp0s533jyjyEoXZb4Bmr51OzkbYYB5ObIM/Qf82g0VZb61HM58rTAudFrekW9RRKrleEVXOQe3JmWo9/pkiwbotGqp24zncvz6lqnUdn5EShH5GmW+KCLfgrFoOT4Oy9UD5XybZT7COt8kkW9B5ks32qUYS34Wx39L+25vkHquaxK+fEyTzHfsSHjqP1CU+VZ/u+KTYc9pzTGX45ctMsnikehMQeYbmPd69Mqw9wa5z6VR8+/1V8TFS/7N12EtXDOJdu8uE9j5SoCiB0sRF0PL8fHii3YHJv/mG/nmOXhKTssr8t0fTnA4muaOhSLyNblnFJFvUUZCXwNFaSNvnlFEvibOt2/kq3r8FBtf32yhEReHgNhblJEAgC1P42uS+da9/kJnvikyrHlNaedy/LJFRX2xkn/znWfFme8WRtMZrju2G4oz30XzzPM0DaPMF0G2uCjzDUQ2k3c7ri58WyeMpzNcPRgVZ748vXiTKJ4k8i3gFalrUH93jXxNxqLl+I1liEa1gtPr6T1+ktfgEy3uFfB1NaU0AAAgAElEQVTXAJWx9Gm0m3fYsQZV5GvyXAB3h3U/arBplC2m4K8VcHEAX53JLwfra/AxviaZb/13n7NKzTLffjoTZ75NMl8E5cC8+awb7ZamM45ydOa76Pn76syeifNNcCC9Uear00J3MMFgvDpd7tn5SsC3aWg8WQsWX9/IV0cAWduMAZrIt4i/Bvj3YDHJSKm/+0W++uywrB2VyWtwHctoopxvkyyOT6PdORenYJ4RRL5F0bVv5FvUF28uxzPz1RsUOt+bzRrW6n69/nZN7pnnOZLmOtMsIfPt73wfjtLPdT0ix9P4mmS+KM6RNct8++3ezTsg/Kgc/7EUOd/nNpqoCHf9N818z6sSq1N6ZOcrAV+elEmNHKCJfM9tNNCo5T8+n8g3brBpaHxdI6w9wyjeP/It5uL5Rr5X9k2zeJ7zTJcdc5xvLcc7ijd0vl3nmQlBWf3d73y3vai0ked8CyG8du/Gme+izJcnt7C8bHFx5vvcpjK+rvfMdCzbnsZ318D5BnRWOmzm2zfzZZLF03+/sj9ybjekztvMl1GtRJQQx3lmk/kG/Hu9LRPY+UrA93w3kxo54B/55p0Af0SOR+SrG2yajsXVMTLh4qi/+0a++VuzAf/I1zgj4ckt3OkNcNbE+fYYiz7seKvI+HpGviZb89Xf/UqCO73ijJS+Dtd7ZlKmUTJossV5mW8lR7WBcDW+Jplv1eXeX2eKOT9RtsgjYClyvgHNxwyd+fbLfJlk8QA1D6cziasH7uuMuc6Ez3wn378KYOdrAT7ZAhOCqpYB+EW+RdGVkuMekcRjKVDw+Hw313vWHaJVr6Cds804eR1+98xgIaF4/gacH8DdYc078uWIHI/I90bfzPn2jXxNM1++3CLTe6Z3ojnJMNQZ32zxbm9o5Hxf6ESNdh2Mr5QSe/vm88w7812YLfTPfJnov89YruybjWWtUUW7VXOfZ9E9MHG+k+93kVM0FsCv16NJCxglwy/z9asfeQw/+y8+7fTZUGDnawFn1uu4fjhy+uz1g1H0Hdk9fpJ/v+Yo59rhKLePUCxno+HMK9LXViSnWhE4vVb3GMsY5zaKI9KzG+73bDqTuNEfx9+RK2e94f78o8+d3Sx4/hv16P1uz+b64choLGc2GpjOJPYH9q1T9LwxmmfrPvNsjHpVFDrf8fM/cJ9nZ3O2/yfl+Oil/o48rDWqWKtXveaZ6fNX77d/NoejKUaTmbEc5+d/YLbOnPVdMw/GRnP57EYDh6MphhP7DLvp89fv8ZlnnVat0Pk+6/H81ecM55nXmqmurWjNPL1WhxBwnmcv3ujj0PNsYGqw87WAdquOroOxAtTp7K16pVApOi1laHqucgYTtFv5xkrJqWM0mTmV6vS1tVv5HAn1nprHWMZGY9HX4SJH920LPxYtJ388G40ahFBjd5Vjds/Ue7oOcvS1mc4z97GM0W7VC53vtrfOjGO9K5LTG0ycNsOUpzOmz1/rjMvztx2L+1wGgM2C8fjoPwD0hmPjsbjK0Z+xmWcuUM/fZiz2z2YyneFgNDWeZz56qb8jD5WKwGbDfZ51DXWmTLDztYDOWh29vuMD7o/RMVCKzpp6j4tRlFKay/FYSLrRPeisGRjftXr8fms5A9N75u5IxGMxcSR8xtIfQwhgs5Evp1JRmR5XJ9/4nrXc51m3HxmSNbNno9/vIsfouXiMZTCeYjiZmY2lVcd0Jp2iZGudcTUklvrv8mz0tRmNpVV3f/6DMdYb1cwzCjVa9QrqVeFxzyznmcMaMH/+ZvPMa8000kt3ndEBq+navD+cYDK17/UYrzPGa7PrOmOmM2WCna8FdFo1dwU3VIpmrYJGteI0kQ5GU8yk+QKvr8sW8eJraOSdHYn+xHiBV+/3GIvhongwmrotJIMJ2s1abnfzWI6nk2fqFKn3exhf4+cfVmfaHo6ETUaiPJ3xcFgHk+DGdx6wGDrfXk5RsQwhhLPDMptJlfm00RmXgHVg4bD46EzfLIvr5XzbBF/ReF1OhukOxqgIVQ0oQtvDNvcGZnamTLDztYC2TxRnGF0JIZwXLL342KSd3aI4sxKafk/4zJd/FseohLbmly00eS7qWtwWX10OCJ/5sig7ejqSJjJq1QrWG1U/p8jCkLgarEa1ktsXKZbjmfmyKjuXELC40hu6hrQDfS0uTtHBaIKZNF3LKDJfZuuMj/Ntss5sNGqoCL9Awm6eua+ZwQNWQztTJtj5WkBnrYbR1JUnZWd8/XgF5obETY4qB9QKygFaTmj+ykajiopwHwtgds98uCWmGQl1LW5lxzl/zTxb6DXPDLNS+8MJZg67KnsDs8wH4M4tM+XiJd/jJmdsHF276r+U0viezZ1v9+dvNs/8eFKmOuPKLStvzYz4awWbRwD9/N15kibzrFIR2Gy6ccussrgegbHp+q+uxW0s4+kMh6OpsW0uC+x8LcArW2BrfL0i0vAlFGOj6JjFsykHCCGirKTbcwGAU0ZRvAe3zJDUDbhHcbZcLPUZt7GocoBBFqdVx0yqDIOLHKt55hhdA+ENSdfKkXTT/+FkhtF0ZqT/rXoVjVqlhLKj7zpjanxd9d8ii+fDLR2MsWERsDrTGyz4S/7rTFg+ppX+O1YL5oEklx2XGvFC4rjIWxnf0IuiZwnFdLJ2WnUcjqYYWy4kuhxg5+SVZHwdyw7mzrdb5mMekRY/Gx2Bu86zzlrxLkTAkydjOc/Clx09Syimzz/Sf9tdlTZzWb/PjfNnn2ENrjPO+m+f+SpjLIB9hm02k+gNbYJ8T52x2QwV2s44OpI2lY8ywc7XAly350spjcnDgH8UF7rVgE1E4ro9u2sZkfjes6Lt7FpG8jM2sEmhu/LkbHZU1aoVbDYds0VW5QA3gzWeztAfm5cDXAm3Vsa3xCzOeCoxGNsFLDb6r+S4c0ubNVP+mh9J3Wae+eiMiZz1RhXVituuStssjv6MDfZHE0hpFnwBJWWLS8t81dBzoDfYVAvKBDtfC3Ct+Q8nM4yn0sr4hubi6IXElSdhQ4RVn7GTY9rjRcPnnm02a6gakDrnDmvoElod+yOHhcQiI6Hf58xfsuAvqs/Y3TObXYiAumc+nD87zpcjf8k6YLF7Nl0L/QeAtuM9MyV1A+79xBR/zS7Ic3ouQ/OARdEb3NcZG73Un7GVAZhncVw39pj2X0tei/s9Mx+LdKA32AYsZYGdrwWccuTJWJcDPMuOJhNJbc92zXzYZfHUtVkqhUVGQr/PuYRm6UjaPv/ZTGLfqhxQg5SqMa8NbMoB+n2u2SKbcrD6jKPOlJAtrlYE1g34a81aFc1axaPsZDnPbJ0v67KjO7fUJiOtrs1uLg/GKmC1ef79seq8bwObXlJajvs9M1//1bW56oz5WFzpDW3DgFU7aOF1xi0wttWZssDO1wJcU6g2vBIlp4bBeGZ9jEV3oLroN2vFhkRfj7vDYrmQuBqSwDV/m0Wx3VTd520VvDe0LQf4Lr6BSeouxtdVZyw5f/Y8KdUCxoS/puS482RsnCIAuGEbsMSbR8JzS62d7+DP3y3DZtOeR8lx55bZOHhACc73miu9wTyQrMZNo+3kTDV/zbZUazkeJtzfJGg7RnE3bKOreCGxTTubt7MA3LhFir9mToR07SfklsVxWxRNU856e3bwzKcHT04IFJ6FOJfjbnzNjZWrI2lbQlXd5/uWbWBsnG9AZ4vsnovqczWzLtW7Gl/jZ+NYQrPZub1Wr6JWEc46Y37PHDMfg7HRsW8a7aZbGwi7zJcbSX1OO7DY2DOcYGpNbzDvv6aux15n9i1L6M7rjGVipCyw87UAfYxFGfwl9Tn7Up2pgwe4pZ374ymmM2ltfF35CzY8iX2HhaQ3tGuw53LPbKMr18i3Nxhjs2HWRR/w48mF3nDRs84WuwVGNlwcwI0nYz+Wcjg/riU00zNXAXeelDV/renKLTWfy+p67B0J3X/NJpAA3PRfX6OZHPU+2+7zNlw8dT32DqstF8vdZpod+1Y22PlaQHyMhSMR1rgc4JhCtY/iHcZizcVyLDtYlwPU+/ZdHFaLe+ayq861hOKSLbJ6/g5lp7gcYDiX69UK1ur23eetS/Wu5S3Lc91cOqnbHC2TfJ+L/terAq262dLdWatj6NB93obzp+W464xtqd4+8xV6zTwcqYDVOGBxpDe4cIuTnzOXY3ccj5vNtK98JD9nLkdtuDINWMsCO18pcDnA01kpghsS+yjOppErkDjGwsGQrEWNIE3g7ORZtAAA3LhlLuRxdW32z8Ymi6MzHzY8qX1LRwJwnGcORGj1OZfnb1d27IUmQnvqvzF/zbm8bc75U3JK0Bln59uyWuCi/5aBhDO9wbJa4MPHLE3/bXUmsP6XBXa+UuCV+ViBEoqtIxkvJE4ZKbtFEQBuWCjfvBxgG/m6cjFsU+gOxtcq81WLus+bZz5ctma7Rr7C8FDd5PU4leot55mr/pvOs2atgka14sT5sdV/wG6eDaIdhdbGN7DO+DjftjxZ2+7zttUC/V6Xtdn02DfAg1tmeH6ohpOdscx8ubYBsq0WlAV2vlLgyvmpVwWapqRO5z4/9in0Q8uFxJaLBbgZrN7QflFMXp8J4nKAVRRv3xvLtouy62G0ir8S1vi6EFRdOD+9wQRti3KAa7bIaZNKYC7WnCdlPxZb5xuwM1i2/dcAN5K6q864zDPbNROw40nZ9JLTcNUZWwcveX0msG2bo+S4jSV5jUXQ9AYXm7lsPb4Adr5S4bI917oc4GBIpJQOXAz7BcvF+LocY+KyeSB5fUYyLBd4wLXsaOew1qoVbDTceFIui6/Ns3GK4l2yRbZZPIfMx2Q6w8Foan3PRpY8Kduyo3qvQ4bVlnbgcM+c9N+x7NQw7KIPJOgNTqVa+wy7lc443TO38qZtOVh9znwstse+AXPCvU3TaDedcZlnK1x2FEK8RQjxNSHEU0KId6f8vSmE+GD094eFEHdRyA0FV8K9jeJtNKoRT8p8Itkcqqvh5LA4NKVzOVzbNot3yqHm73K0hMsxFt2B+aG6sRxHbplb5sPF+Abm/Fg6ki5lB5cePy6BkZOT79AGxqYFDOA4Fhf9dyw72cioVIQqb1nSDlxajejrM4Utf1G914XeYM/FUtdnM5cddKZVj+gN9g7rpmHbHC3HPvNtpzNlwdv5EkJUAfwWgLcCeC2AdwghXrvwtncBuCal/HYA7wHwG75yQ8KlZ4ltdCWEsM4W2PJK1Hvty1u2XAx9Ta7ZQlO4RHFO/KU1dYzFvs1CYtEXS8O27BAfquuSLbRyWF2db/vMh81zaUWbM8pwivT1GcvpT4y76MdyHLOFuuWCCVxKdU7Gd03RG8ZWPCm7NVNfk8080130XXhybgGLbbbQPsNuMxbt2Lg43052xmae9dUuROuANbCTXxYoMl9vBPCUlPJpKeUIwB8CuHfhPfcCeDD6/4cBvFmY1udOAPoYC5uFxJZXAtgbX6foyqErdHcwtioHqGty48lZLSQOPDmXE+1dDJZLdGUbxR1Eh+qG5snZcjGUHFV2sNlVaZuR0Ndk4xQ58RcdeDK6L5bNsubM+XHJfFsYedueheq9UT8py3nWtnz+ttwyF/13Iam7zrPQnD9Nbwit/y52xqaXnIZLwLpvGbCWBQrn6w4AzyV+vxy9lvoeKeUEwA0A5whkB4FL01DbcgBgX6px5WIlP2skx5JXpq7JruzoUg6oxtuzHRzWwNwil+jKPvNZbgnN5FDdWE6rjvFUYjC229gRep7ZtjPQMgDbDKvDWCz1fzSZoT+246+tN6qoVoRjCS3wOmPZAgaw5/yUt2aO0ayZH/um5LjQG1x0xtLOuHCxXLilLmumpc7Ex76t6G7HtFBvcTaZvAdCiPuFEJeEEJf29vYILs0NTnVyB1KfbebDtRykPmupFA6O5L7FQhIfqmt9zyyNr2UjRyBJuLU0JNZZHFtH0j2LZ8uTMz1UV8OJW2ZxqG4sxzVgCU1SdxmLpfNt20Uf0E2jXR2WwCR1S/4iYL9m2h77BpSo/5b0BrXhylFngm9Scltn7HXGruzskvksCxTO12UAL0/8fieA57PeI4SoATgF4KXFL5JSPiClvCilvLi1tUVwaW7QnArrKM5a+ewWRact4I5RnO1kbbdqkFJFGkYyHBZ49X63KM62zxdgz1+wT6HblR1csjjNWhWtesWaJ2c7FluHRXfRL61UX0K20IaLBSg9HoxnGE3MsoUuXEz1fvt5VqsIrFnRDlw2dtiXg6z136GEqnlStvPMeiyWOtMfTzGxOPYtlmObLbQ8c1O91zXz6Zb5MqU3uOh/WaBwvj4H4B4hxN1CiAaAnwPw0MJ7HgJwX/T/twP4C2lDDikZtmXH+FBdi10bgMOi6NJ/yeEYC1suVvKaTMfjwitR77czvr3BxOpQXS0jeY1mclzKjiqKM1UFF16Jer89T8Y2kLAl3OoeSk7Gt6RNKqE5f7Y92FyjePtswcSBv+bG+XEJ8lz4S6bHvgGK3tBu2mfYXday5DUWwYWLpeTU0RvaPBe9zthvUrF9Ni5r2WRmTm9w0f+y4O18RRyuvw/gzwA8AeBDUsrHhRD/RAjxU9Hb3g/gnBDiKQD/AMCxdhTLBNsUqks5ALDfauzCxXA5xsKVCJ28xiK4lAO0nODRlWXZQfHX3Dh/05nEoWH3eZdygHq/PU/O+Z4ZPhuXLB5gT7jvDiYQAlaB0Vq9ilpFhKcdWHLLXPiLgFup1iWLD5jr/3AyxWA8cxpLbzjB1JDe4FKqB3SGzZbzG3adceFiAQ76P7A79g1IZL7Kmme268wSOl8kuTgp5UcBfHThtX+c+P8AwM9QyCoDtoRLFyK0fv/+cILJdGa03bY7sDtUN5ZjzS1zI0LrazSS4eqwrtXxV7s94/e7HC1hm8WxPVRXI+mwbBg4B84Oi0O26PZTLTsZlouvsyPpQLi3PVTXrQ2Mg/F1vWcOTv7TV/aN3+/mSNqtmS4UiqSc/cEEp9aLr9F1nbE9Yq7XH+PlZ9asZNjSG9x1xmH9t5xjjZrqPm8qJ+avOZQd1TWOcaFTvEa59PkrC9zhPgW2vbGco6vo/abHWOh2FrZdOmz7lrkS7gGHKC50FseBv1SvVrDeqFobxdBlB1fOj0vmw4VXoj5rmcVxGItN93nXHj8282wabWd3LdXbRvHBeXIOWdzNRkRvsNR/63lmyS3r9u2OfZvLsaeEuGcLzccCuOl/z4Le4KL/+rpMdeZgNFVd9B04v/oaTeDqsJYBdr5SoI+xMOdi2NfI1fstja8DqRNQE9Z0LC6H6gLzyW3PX3DjL5kvJPZZPCXH3GC5Rle2DmsvKgfULZoSAm48GVfysDV/yWGHqPq8+bNxOdfNhie3H8/lsjg/YUnqPYfNAzG9IbDO2BK7Na/MNmC1b2nhxl/S12gmwz2LZ0NvcNF/fV2m3DIfzi9gH+TZtM0pC+x8pSA+xsI2Hezoxd+wyLC49Cux4Za5L/BllR1r0TEWhguJw3Z2wK5U68MrAeyieJf0uU3ZYb6d3W4szVoFjWrFPFvs6LC4ZIucnr8FSd15LjuUHStCBYe2cg5GU0wMm0Y7zzMbnfEoOwMWVQmHcrC+LtOxuAas1o5EWTrjbGfMHVYX/nLy/TY6s96wD1jLwPJd0ZLA5ugH37KjDU/CqYRiMxZHQxIfY2GhfI1qxakcoD5vsZA4RnHBHUnrsqNrCU2Rh02yhXE5wFKO4kmZ82TcycN2GVbXzKdNqfZGrP/hy47tVt2Kv6bkRN3nLdrAuK0z5iR1n80DgKXz7VwtCOt8W9MbHFpAAPaboVwPonZbM12DfHOqzjKWHAF2vjLRbpZgfG2juL49fwkoJ4ujj7Gwi67strMDbtkiF/6CSxTnWnawciQdszij6QxDg35Srgs8YOewxF30rduz2PJk7PmLgFsWx3aebTSqqAi7LI5rCRUwkzOeznA4mrpnPqzvmd14TtnuEPTgL/UGY6Om0a78RfUZu3lme+wb4FKVcJ9npSUsLHhyy0i2B9j5yoRN2aE3mETlAEulcKj5u5KHTbvPu/aSAuy4ZYqL47Yo6s8XYTCeYjSdOSmfDefHtf+SbdnBh7+k5BSPZ87FCc+T22hUrQ7VTV6XLefHFmVw/oQQ1vPMVf8Bs3u276H/7ZZ5tshXZ2yejavzregNxXJ8uqjbzjM3GeZ2Rkrp1OcPUPPMVmds51mrXkWjWrHKSi5jjy+Ana9MWEXxfbddiNZbjT04P6bHWLhm8YB5ecsEzuUAi8jHZ6eLHefHfSFp1ip2WRwf42vwbPzumV2G1XWOqc8Xj2UWddF3LTsdjqYYG/CkfHoJWc0zD/1Xny9BZywyEtWKwLplwBrTG6zKjm5jUXJMdMa9nYG9zrismeb673rsGzAfiwm9wcvOWNAbXDcPlAF2vjJgE8W5bM0G5jswTBas8VQdquuTLTJafB2JkFpOcFKnRebDtRwIzJ1vo4Wk71YOUNdms7HD0/ga3bPyyo5u2RXz0wf2R+6H6trw8VyJ0PozZZTQ1OcNxuLIxQLsS2i2XfQBRW9QTaNtMh/u2WKTeeblfNvQGxyrBVb671gO1p8ZT826z5e5zizjodoAO1+ZsCXcuyiezTEWrrsQ1WfMswWuREj1GcsorqwsjqOTN5lJ9A36SbmWg5Ucs+fv2pQQcMwWht4h6NDIFwDWG1VUK8LKkXSN4pPfYSLHZTu7LR/T6/lbGF/XbKEpvcF1LIA5t0wf++anM+HXmdCbB+yCb7/KB2A6z9Sxb82aQ8C6ZhGwesyz0GDnKwOdVh37I3OelIsHD5jX/L2UwuLcxd5gjKrlobqxHMuaf+iI1PUsNCXHLvPhSuo0jeIG45nTobpKhvlYfJx8K/7S0C0iFUIYZwt8+IvzeWYmp92soWq5C1FfW3D+koUj6dp/CVBzxpTe4DoWwHyeufaSU58xd1j85pnN83fTmWZN0Rvssrju88z02bhysTrRZogi6GPfXG1zaLDzlQHNk+oZbM/2y3yYGV8vLoYFt0w3crUtBwDmY1HX4raQqPJexXAs6lpsDtXVsMoW+UTxhlGcb0Yy+R25chw7jwNqURyMZxhODLKFjg2DAfNsgV8Ub84t8iltmOrMNOavOQQSzaj7vFXZMTwf0ytbbJSRIhiL4TyrOQesFvQGR8I9YKEzXpxfdZ9vmDwbH/03DFj74+jYNy473lywTdU6L76GZQff6AqwWBQdx6I4X8X9pOJDdQMrn2sLAMCWJ+Gb+QzNK7EpoahygM2hurGcNfNskc8uJONssQ8Xy7Ls6Pr8TRsg++xCrFQENhuG84wkW2RmfP3umUUgYdmtH7DNfKs10zVgNaY3OJYdAXNu2XydCbur2i9gMaM3+PCXywA7XxmwrV8Hj+IIyo6mC5Y7F6NudIyFTzsD/Tkbwn1obplrF30lx2yHqI9RbNUrqFfNeVI+z19/Rx7UdvbwpVrXRq7qM5aGxEP/94cTTAvoDT7PX3/OdJ0RQp3VaC3D1vgucRbHpgefbxZHf0cehpMphpNZ+DXTI2A5ZVGq9V1n7PirXHa8qaAfWFHk43qorka7ZXYelt9CYsf5cY5IDTMfPlk8/TmzsYxRrwq06vbT3C6K83S+LRZFl3tm00+q53gcC2A+zw5HUTnAZ/G14PyE7ifny18C5pmtLPjQDpQc83m22axZd9FXMux4cj7zzIq/6PBsGrUK1upmTaN9+Eumu3d9uJhKjlmG1YsnZ8uT9Fj/h5NieoMPhaIMsPOVAdMoft83i2OcDnZXPptjLLwiUkOHxaeEpj9nMxa3coBNnx+3/juAGovalWW2kHjtEDPMsPlwsfR3FMlIvt9ejh3nx2WR32xEPKngOmPGLfPhYqnP2emMmwyzzMdkOsO+I38NMOdJeeuMxTzzeS7qOwzXTA870zPM4rkc+wY4ZIs9sniAeZDPfb5uMpiS1H22ZgNqIpkcY9EbqHKA7aG6GsaRr8dxDKbcMpISimHN34dXor4jfyyuh+rO5ZhlWHzIw+pz5jwZ911IZiUUn/5r6nNmWbxu3/1Q3UrcBibwPIt04IapznjtEDMkQnuU0IFi46vPmHS/Z7Wo+3xBwOLRs0p9zrAq4dk2Q32Hmf77zDNTp8il/xoANGsRvaFgLKptjp/zDYS3M6HBzlcGTKO4G94RidkxFt1oO7tLOUDLMc98+EUkxlG8VxYnbHTVqlfRqFXMszihs0WlZQs9jK/hGXL+jkQdB6MpJgXd533mMmCWLfI5jgUoOVtszMXyDb7MnG/ve1ZkfPv62LfAJPVS1kwK/Tfj/Lk+F9UGpnieDScz52PfAPOqhO89Cw12vjKgj7Eog79kIsdHKYAow1YQxU2iQ3V9+q8AJveMICI12FXpehaahkm2wHvzgKEh6Q1UOcCliz5gx5Pz4ZXo7yiSAfiVHdX3FD8bnx4/JjyZg9EUM+nHxQIsSiiBy46uZ64Cqvv8eqNa+Px9AxZTbpnmYjkHrIbZIl/+ElDsSPiuM+1WDaNpMb3B9zgeVckxqxa58+TM1hnfbGFosPOVgfgYi9BRvAVPxteRKIp8KBZ4oIyyo1pIhpOCzIfjWWixHINsEQWvBDArb3uPpWCOxeUAx+ey0aiiIiwyH74lYROd8QlYDEr1PjsqAeCUpc7ooNAWnVYNPYPu8yQ6UwLnL/k92XLcKRSAmf6Po4A1eBavTDvjqzMGGUn9XjcZhvSGgfuxb2WAna8ctI0mkvr7KW/lMyg7ekfxYRXcNIqblwPclMJmwXLp8aNhcoyFb3RlHMV5HpNhQh7W5QDXsQghjLIF/pGvabbYP4o3NYrePDmDsWw0qqg58NcAdX3SiN4Qfp75cv7My46e+m+T+XYcizG9weMsRMCCW+bRsw6wtDOhnW8PXlkZYOcrB2ZRnCd/yZBb5l92tIhIHOXoYyxMDJZrU0LAjlvmF/maO9/+kYA9naUAACAASURBVK+B8+0VkdbRH08xzuFJUXAkbLKFviR103nmik7LoITiyV/cbBnqv+9YDDKss6htju89W6pqgY/+R4FEHr3BV/8BMz5Wd6COfVt3DViN75knVcPIzvjz15LfkynH8/mHBjtfOeismUQ+UTnAN/NRwMfy5y8V86R8uViA2U5Efy5OsSEZT2foj6cE98y0/07YKM6HiwWYZYu6nrwSLcckW9D0KAeYlh0p5pnJcwHcy47VisBm02yd8Z3LQL7B2h9NIKV7FgewzBYF7idHsWaOpxKDcXbAMuf8+nJLTdZ/t12IWob+nnw54QMW32zheqOKakUY8aSXtccXwM5XLoyiuL5qSuhyqK6SYZ4O9o3iio6x8I1I1WfNeDKhDYnvAq8+W9xqwLeL8lq9ilpFmGU+PXfu6e/JlOFJhFafNct8kGRxcnRG8df879l+AU+qPJ3xzOKaPH+KzKdJ2Tnqot925K8Zt7QhqBYA+U4+hc4Y0Rt8x2KwZvoe+wYYPn/PsqNqGm0SGPnRDkKDna8ctA1I6j5bs5WMYqWYzST2R+67kJScYoPl28hRyTHjyfgs8KcMSii+pS3AvIRWdTxUF5gvJCZ9vnzJw+p7io2vVxRvyPnx5ZUA+WPpj6eYeB6q22nVICXQGxbrjHe22IS/SKD/uZlPAv030pnBGJsN97Y5zVoVrXrFiI9JMc/yslI0ZUeDUp3nWEzKjhRZvHazhsE4v/s8xZmLpvNsWXt8Aex85cI0ivN5wCbHWPSG/uUAI+NL0JTOpOzoz8WyyeL4jaXoGAvtfLuWA7Sc4NnCOPNRXHY8VcJuN5+xtJtR93kTRyJ0tpDCYTW+ZyXpv6/zXUBv8NlRG8spML762DffjCQA3MjVGao1s6xqQXHASpFhzac3uB/7NpdjUJVgwv3NCzOelF9EAhTzJEiiqzWDKG4wcT5UN5ZjxF/wjeKLFZyi7GiSLfA5o06jyJDoQ3UpeHJ5z6ZHYHx1D7Y8+DRyBVT3+c1mfraAhL9o8vyHE6xFO9ZcYcqTotB/k1K9r25OC+gNvYHfjjolJ/+e+R77lvysWbbId80My19r1SuoVUSB/lMELCZrplr/fQLWdrOYj+sbsIQGO1856KzVMJ1JHOYcY+EbxSs5+ZEPiVIYlR3HzofqxnLWTHbu+C8k9aowKqEFz7B5RqRA8cYOGv6aSdmRhie3P5zkdp/v9f0XxSJiL0lGwrBU67ujqkj/KfhrZmVHSp3JfzbeAUvBPaPiLwLF98w/YDUtobnLMGkDQ6ozuWumPxeriN4QH/vGZcebEybcEpKFpIBbRkLqNB2LpyNRRISMD9X1XUgKFizf/ktAknCbX6rzjuKbBYsiSQsIA+c7Kge4HKo7l6OucT+PJ+WZ+QSK55lvI0fAfJOC71iK9F930feZZ/VqMb2BquyY/K5UORTGt0D/b5CUg4uJ/b7HvgFzekNe93mKnXuFdoaAv1iezTRNWKxo5ksIcVYI8TEhxJPRzzMZ75sKIb4Q/XvIR2aZMKuTU3jxhsaXZIdYwaJIoBSjnIVEG2WabKEJ5+fmyHyZcLF8HNaNRk11ny/K4niWA4y4ZZ6cPy3HiPNHkvkKr/+9nH5SFPqvPh/e+JryMYPrv+cuZC0j+V2pcjw5v0BxeXsyneFg5Nc2B7DJFobdiUyzZobX/9DwzXy9G8DHpZT3APh49Hsa+lLK743+/ZSnzNIwr1+nP2R9qK5/FF9UQqHZHZL8rjRQcDGKCJcUHAn9+SL+ks+hukqGGbfM25EojOL8o/iKQT8pCv7avAdb+ngG46k6VNc7ii8yvhRRvBlPjuKezaTKcKXLIApYDObZukcXfaA8nmSx/vvfs2atgka1UhgYUaz/QPY8iwNWz3WmiCfne+YqkCzV5j8bivX/YDTNpDdQ7HYPDV/n614AD0b/fxDA2zy/b6lQxPmID9X1Nr5m5GEfOSbHWPhysYBEqj5Dzg2qKL6w7DjxOlQXMCyhEEXxh7kLCWG2sDAj4e9I6u/KkqGvxUvOWr7xpSjVGrVnIdGZ/GwRRRZHfb6YJ0cxx/R3pWE2k94NgwGt/9mboXyPfQM0T6pgnlGMpYDeQKb/RWum57FvgGG2kGKeFdAbqAKWkPB1vi5IKV8AgOjndsb7WkKIS0KIzwghbhoHrWjxpVjggXk6OHshUfJdD9WN5RTW/AnIw6aGhKJUV0CE9c7iFYxFH6pLwV8CsrMFZMa3IPNBwispKDtQlIPV54sdSd9DdWvVCjYaBTwpinlWYLAo2lmozxfz5ELr/8FoEvHX/OfZaDrDcJIRsJBl2IvoDTT8Jf1dqTIIdu5qOUVOke8uxI1GVdEbSqAd6O9KlXETlB0L74AQ4t8BuC3lT/+jhZxXSCmfF0K8CsBfCCEek1J+PUXW/QDuB4BXvOIVFl8fBoWLIlUU35ofY7GWEnV0B2OvQ3WTcsJncQyjOApHIjCvRB9jkXXP5rsQ6bJFZzYax/5O5+QXc8tuO9Xyk2Ga+SLIsPai7vNp2U2qHj952UIpJRl5GDAwJATG95tXDjL/TrXhRn1X1liIdaY/TnWw9TOjCVjzS2ihs4Xlcf78g2/VNDrbzlAc+wYUV1iosoUhUXinpZQ/mfU3IcSOEOJ2KeULQojbAexmfMfz0c+nhRD/HsD3ATjmfEkpHwDwAABcvHgxu7lWSSjKSFDyl9T3jdOdL4LoClDHWGSNJT5UlyhblJWqp+glBRj0RiPgYhV1n6caS1EU1xtMvA7V1Wi36njupcPMv/ueHwgkn39BOYAg8pVSnUeYds0UpS0gf54NJzOMp5LMYcnWGf8WIOrz+dni3mCC85vHnX8bFNEbKPUfUHq+3UmTo4598w5YDUjqdOt/gcNKwC3rj6cYT2eop9wXCkcS0JSA0DbTLMhbZc7XQwDui/5/H4A/WXyDEOKMEKIZ/f88gB8C8BVPuaWgWauiWatkp4MJy45A9kSiICgC+VFcfKiuNxG2KIqn4y/0o14uqXKIDlXNy7BR7A5Lfj7L+OoF3qccAKC4N5bnsT/A/ID5Ip0JX6qdoE0QsORli6lIveZlR3+DlburkiCLB8z5WKkyYp0JnC0icIqAfOc7DlhvmrJjMb2B5J4189ZMuiye+r7swJgiYA0JX+fr1wH8DSHEkwD+RvQ7hBAXhRDvi97znQAuCSG+COATAH5dSnlTOF9AfuRDV3bMP8aCohyg5BQbErqyY76cTSKDlZctoIrisksodGXn5Pcdk0OwNRvQZYd0GaMJTTmgWhFoN7O5RXRlxwKDRdDIFShX//MClmatgmbNz5Ak6Q2pcijnWWEJLTC3lGosOcEXxbFvQDG9gc5hKbpnlGtmSfqfU3b0PfYtNLxmjZTyKoA3p7x+CcAvRP//FIDX+8g5SeSR1MnIwwZR3Hbbj4uj5BiMxXNRXKtXUauI3Ciu3ayh6rELETjKLTu32Twuh4C/ABRlvogd1hzjSzWW3nCC6Uweu/8U28xjOTmnHJBx/ooMyWCMO86seckAlG4/tZs+lhtE+t82cSRInss8MFqkNyj+Gt08C73h5lQRt3RApP95zjeRU6SaRueszdGxb21v/lqxnaHKfD5zNZ3eQHGKRvLzefNsmcn2AHe4L0Se8lH0XwIM0sEEjRyVnOzzsKjGoo+xyKv5U6W21fcdH89sJjO5QNZycjlfxI5EzrPR4/WBvu9p27OpxqLl5M2zWkVgzWMXIpA0JNnPhobzVawzvou82pVZQS9n2zyV/gPpBqs/nmI6kySlejOdCdsbiyzz3aphMJ6l0hsou6gXzTPfY9+UjGIOM9UmlWI740lvaBaPZZn5XgA7X4XI22rcHUzQqle8DtUFilPoFI1cATXhs46xoOJiaTm5JTSi7Ir6vhRHIioH0PDkistOvs9ms1GDEPk7RKmiePV9x8cTj4XAySu6ZxT8tUKeHGkJLb2fVJfQ+BZli6j0X33f8XlGuTvMJFtE1wYmMH8px8mjyuIBBfQGwp276vuOj0Uf+0bFkwtN1SikNxDpf0iw81WATquGXmheQU7mg7QckNN9noqLARQbEqrFSn/fMRlE5QD9HXnlIIpygO4+H/ye5ZQdqMoB6jvyy9u0zvfxsQzGUwyJDtXttOqYziQOU7rPU5WdgWKHhfSe5TkSZPqfbXzX6tXU3XY2aNUrqFfzeFJU8yzPYSVcZwqdb8LgK+Wezbvo04xlfzhJbRpNRdUBCugNRGtmSLDzVYAiwi3FZM07xuJwpMoBwY1vmVEc0QKvvi/wWFr1zGMsutF2dt9ygJYT3vhmc8vIjW+ezgTO4lCWg8wcFpryVi7nL3DZkdaRzMtI0Oi/4kmlOyz62DfSNTN1nSHMFpah/zkbO6idIiCd3tAd+B/7ppFfYaGZZyHBzlcBOjllRyouRt4xFqQL/Fp2nZyq/wpQwC0b0mYL88ZCky3M5klRRldZURzVobrA3EikPRuq/kuA5nzk6AzBc6lXK1hvVFONIunmgZy+Zb3BBI1qBU1P2gFQzJMJncWh4mIB6p6NMugNVPoPZM8zqmPftAwg3fmmOPZtLiefJ0dxzzYaNVREQQmV0MnL0hnfY99iOUU6w5mvmxvtVi1zIaHqJaXkpDt5lE5R3q6qbt//UN25nPyyE8VY4mMs8sqOJBmWbG4J1ViUnHTnWzt9VE4xkM/5oeuNNMZslsKT6tNsHpjLSXOKaccCZOsMBX9NyUnXfykl2TzLc74pm1LmGV9qncnTf0qeXNZYAP8u+kpOEVXDX0ZMb0jVGbrnr+/7jRydoUBWtlgHrFS2ORTY+SpAftmBhlcA6IkUuBxQUHYki0gzUujxoboE9yw+xiJ4OSCHW0a4nTkrw0rNxVLfmT4WqnJAp1XHTKpz/NLkUJUDsuYZNRcLODn9H05mGE1nJGPJozeUd8+IdaYE2gGQrTMUx75pOZn0BqKyI5DNYaXdcFGwZga2M5SVj5Bg56sA+XVymogEyOaWhSg7ZmVxyIziWh2HI3WMRRL6UF26skNGFEe5eSBvhyDhjpqsBqhU5/oB8wg9y2GhKwfk76ojLdWWVEIpS/8Xd1VSkro1vSHLkQSIM6xl6ExuwBKY80fqFKVn2GYziR7BsW+xnKyAJXrtFGGpvgw7E9r5Dgl2vgqQ1UldkTopI990/gIpeTiP80PJxdD9pBbGQx2RZHHLtByKckBeqY6Kv6TlhOZi1KoVbDbTS3XUY1HfeXQ88aG6hNmifJ2h5Bamc34o9X88lRgu9JOibGeh5aSXasdo1iqph1RbyyjglobXfzrjq+kNmWMhzOLo70zigOjYt1hOhsNKqTOncnSGNvNVw/5wcozeQMlfDAl2vgowLzsdnbC6HEDKX8gpO1LUr/OOsaDlYqRHi1R9seZy0mv+lOWAdlHZkXAh6aUsJJRcLP09WdEiHRcrPfKl5C9qOfk6Q8j5yuCWUT4X4Hi2iDqKz15nJqT8VeC4zqi2OZQ82Wz913/3RT69gY6/lLXOUGYk1ffk64zvsW9KRv7GDsp5lkZvoNT/kGDnqwBZKXRKjgSQV0KhUz61kGQvWJS8AuC48aXkFejvCV8OSH/+8aG6hGUnKdUB50lQG9/se0ZZDshwJMh1Jps8THWobrNWRbNWKaGElhGwEJbQtZxsLhZt5nNR/wfjGcZTmrY5Wk5/PD3WfZ6SJ6m+J3uehV5nyHUmJ/O5SXDsG5CgN2TpDPU6Mwi7ZoYCO18FyFwUCctBgMp8pB1j0e3TlQOUnByHhbjsWIohyYhIyTIFzfTu8/GhuoRlJyBn8aU0JFnON3EJJbzOqOd/nCdFe6huvsNCqzM3FgMWwnKQ/p4yuFhA3vOn03/geHmLOvORfc9ouVhA3poZmFtKOBZNb1gcyzTmr4VeM5lwvxLIqsWTczGyFhJCXpmSc5wnM+evhR1Lb1hOFEc5Fr09+9hYqDNSGTyZHtGhurGcVj1+DotyqKP4tLGoa6CbZ5OZxGB8NGCh5GIB6noXnW/VfmYWXP8pe5ap78nj/NHIWKtXUauIk9OZoTr2rVmjC1jT7xk94f5YkBfA+d4fpfGk6HVm8Z5RdtFPfs9x20yrM6HAzlcBWvUKahWRmZGg5C8A6SlUytp1u3k8iuuPp5gQHaoLJPkr6WVH0t5YwwmmizwpQl4JoCPf0GPJiOIGY2w2aLroKzkZmS/C/juZ/KVgOnM8YCHVmZTMB9VB9BpZ3NIQ8ywri0clI4vecIN6LM3sbBGl/qf1E9PHvpWh//oaaOTUICWOHeJObmdSdIY6I5nNk1QB6yZB25yQYOerAGp79vEFSy+Sp8h5EscnLGXtOm2rOTkXq4C/Qmaw9DEWKQaLKiMBpC++IUpo6ntTxkKa+Tw+l6nLAfVqBWv1aviyU2k6c7wHW5z5Dj2WwRi1isAaGe1A0RuGk6NNoylbgADp84xcZ7K4pURNSZNyFp8L5bFvQDa9gb7smF2qC25nAvBXk98by+mPyY59Cwl2vgyQ1kk3BOEeSI/iadPBKVkcYqO42YgWkhRDslavokFwHAuQwy2jTqGnLL4hyOPJ743lEEekuoSS5EntD2jLAeq70nQmTNkh9fmTZj5r6JWw4QZINySdtTopfw1IL9VQcmTSeFLBdCYlmCRfMwOXtuLu8ylZHICWv6a+N/CamVMtoKa3pK2Zy062B9j5MkLaGVLUvUSyuGW9AFFcaC5GpSLQTjnGgpKLBaQbrJi/Rlx2zOQvBe6NRc7FWKthOpM4HM0zH5SNXGM5Kdyy3mBMWg7IKtWFmGeZXByiZ6O7z6fNM+rnor9XYxDtGKTOfJyozhCPZX+B3kDNxdLflbb+rzeqqBO0zQHyuaXkdiZF/wG6e5Z19BMlfzEklrsouiRot2r48vNd/MM/eix+7UuXr6NeFSSH6moZAPCBT38T/+GpK/HrL1wf4K/ffY5EhpZzMJriVz/yGHQw/cL1/pFroJFTxyef3Dtyzz799FVyLgYAvOdjT2K70wSgWkBMZ5I4W1TDwy8dHhnLkzu96BpoxqP76/zRF57HX+3ux6//1c4+3vCK0yQygPn1/k9//GW0olYMNw5py8Hqu2p49NnrR+7Z55+5RloO0Nf7/r/8Bj72lZ349av7I/KxXD8cHRnLcy8dxn+jgOZJffyJnSNn4j3yzDWc3WiQyADm1/u//ulXcSb63mG0YYG0VN+s4/Hnrx65Z0+80I3k0BrfD126jC9evhG//o0rB/iRV6+TyFBy1PW++998CfVovb+6PzxyDTRyavjsN4/es89+4yXyzDcAvPfffx0PffH5+HVqnmy7VcNud3hkLN+8cnDkGnyh6Q0f/fKLeKE7iF9/7PINvOIc3fMPBXa+DPBD334eX3txH3/++M6R13/01dtk5YDzm018952n8NTuAZ7aPYhf32zV8NfvPksiAwC+/5VncFundcRYAcC3bW3g7vMbZHJ+9DVb+PPHd47ds7/zPdtkMu7ZbuPu8xv4wnPXj7x++6kWvvfldA7Lm151Dn/51JVjY/n+V54hOY4DUAvJf3TPeTzxQg/futaPX68IgR/4tvMkMgDg9Xecwh2n1/DJJ68cef0VZ9fxnbe3yeT88D1b+FcPP3vsnv3Ya+ie/x2n1/Cdt3fw1Rd7+OqLvfj10+t1/LW7zpDJ+WuvPIs/fvRbx8bymgttvPwM3SL/o6/ewiefPD7Pfvgeuuf/mtvaeOW5dXzum9eOvH7H6TV89510OvOD334Ol565dmwsP/Cqc2QB62azhjfefRZP7x3gmauH8euNWhU/8G10Aev3vvw0XnaqhU98be/I63edW8erL9DpzI+8egsf+fzxefbjr9kik/GKc+u4Z3sTjz/fxePPd+PXt9tNfP8r6XTmjXefxZ9++cVjY/mul3XiQJkCP/4dW/jsN47Psx/+djqdCQWx2CNnWXDx4kV56dKlk74MBoPBYDAYjEIIIR6RUl40eS9zvhgMBoPBYDBKBDtfDAaDwWAwGCWCnS8Gg8FgMBiMEsHOF4PBYDAYDEaJYOeLwWAwGAwGo0Qs7W5HIcQegGdKEHUewJXCdzHKBj+X5QU/m+UEP5flBT+b5QT1c3mllNKoN8jSOl9lQQhxyXRrKKM88HNZXvCzWU7wc1le8LNZTpzkc+GyI4PBYDAYDEaJYOeLwWAwGAwGo0Sw8wU8cNIXwEgFP5flBT+b5QQ/l+UFP5vlxIk9l1ue88VgMBgMBoNRJjjzxWAwGAwGg1EiblnnSwjxFiHE14QQTwkh3n3S13MrQwjxciHEJ4QQTwghHhdC/HL0+lkhxMeEEE9GP8+c9LXeihBCVIUQjwoh/m30+91CiIej5/JBIUTjpK/xVoQQ4rQQ4sNCiK9GuvMDrDMnDyHEr0Tr2JeFEH8ghGixzpwMhBC/K4TYFUJ8OfFaqo4Ihd+MfIIvCSHeEPLabknnSwhRBfBbAN4K4LUA3iGEeO3JXtUtjQmA/0ZK+Z0A3gTgF6Pn8W4AH5dS3gPg49HvjPLxywCeSPz+GwDeEz2XawDedSJXxfjnAP5USvkdAL4H6hmxzpwghBB3APglABellK8DUAXwc2CdOSn8PoC3LLyWpSNvBXBP9O9+AO8NeWG3pPMF4I0AnpJSPi2lHAH4QwD3nvA13bKQUr4gpfx89P8elBG5A+qZPBi97UEAbzuZK7x1IYS4E8DfAvC+6HcB4CcAfDh6Cz+XE4AQogPgRwC8HwCklCMp5XWwziwDagDWhBA1AOsAXgDrzIlASvlJAC8tvJylI/cC+IBU+AyA00KI20Nd263qfN0B4LnE75ej1xgnDCHEXQC+D8DDAC5IKV8AlIMGYPvkruyWxf8B4L8HMIt+PwfgupRyEv3OunMyeBWAPQC/F5WE3yeE2ADrzIlCSvktAP8MwLNQTtcNAI+AdWaZkKUjpfoFt6rzJVJe422fJwwhxCaAfwPgv5ZSdk/6em51CCH+NoBdKeUjyZdT3sq6Uz5qAN4A4L1Syu8DcAAuMZ44Iv7QvQDuBvAyABtQ5axFsM4sH0pd225V5+sygJcnfr8TwPMndC0MAEKIOpTj9S+llB+JXt7Rad/o5+5JXd8tih8C8FNCiG9CleZ/AioTdjoqqQCsOyeFywAuSykfjn7/MJQzxjpzsvhJAN+QUu5JKccAPgLgB8E6s0zI0pFS/YJb1fn6HIB7oh0oDShC5EMnfE23LCIe0fsBPCGl/N8Tf3oIwH3R/+8D8CdlX9utDCnlr0op75RS3gWlI38hpfxPAHwCwNujt/FzOQFIKV8E8JwQ4jXRS28G8BWwzpw0ngXwJiHEerSu6efCOrM8yNKRhwD8fLTr8U0AbujyZAjcsk1WhRB/EyqKrwL4XSnlPz3hS7plIYT4YQB/CeAxzLlF/xCK9/UhAK+AWtR+Rkq5SJ5klAAhxI8B+G+llH9bCPEqqEzYWQCPAvhPpZTDk7y+WxFCiO+F2gjRAPA0gHdCBdSsMycIIcT/DOBnoXZxPwrgF6C4Q6wzJUMI8QcAfgzAeQA7AH4NwB8jRUciZ/n/hNodeQjgnVLKS8Gu7VZ1vhgMBoPBYDBOArdq2ZHBYDAYDAbjRMDOF4PBYDAYDEaJYOeLwWAwGAwGo0Sw88VgMBgMBoNRItj5YjAYDAaDwSgR7HwxGAwGg8FglAh2vhgMBoPBYDBKBDtfDAaDwWAwGCWCnS8Gg8FgMBiMEsHOF4PBYDAYDEaJYOeLwWAwGAwGo0Sw88VgMBgMBoNRItj5YjAYDAaDwSgR7HwxGAwGg8FglIjaSV9AFs6fPy/vuuuuk74MBoPBYDAYjEI88sgjV6SUWybvXVrn66677sKlS5dO+jIYDAaDwWAwCiGEeMb0vc5lRyHE7wohdoUQX068dlYI8TEhxJPRzzPR60II8ZtCiKeEEF8SQrzBVS6DwWAwGAzGzQwfztfvA3jLwmvvBvBxKeU9AD4e/Q4AbwVwT/TvfgDv9ZDLYDAYDAaDcdPC2fmSUn4SwEsLL98L4MHo/w8CeFvi9Q9Ihc8AOC2EuN1VNoPBYDAYDMbNCurdjheklC8AQPRzO3r9DgDPJd53OXqNwTiG64cjfOKruyd9GQwGg8FgBEFZrSZEymvy2JuEuF8IcUkIcWlvb6+Ey2IsIz506Tn8Zw9+DgfDyUlfCoPBYDAY5KB2vnZ0OTH6qdMXlwG8PPG+OwE8v/hhKeUDUsqLUsqLW1tGuzUZK4j9wQRSAoej6UlfCoPBYDAY5KB2vh4CcF/0//sA/Eni9Z+Pdj2+CcANXZ5kMBYxmMzUzzE7XwwGg8FYPTj3+RJC/AGAHwNwXghxGcCvAfh1AB8SQrwLwLMAfiZ6+0cB/E0ATwE4BPBOj2tmrDj6UcaLnS8Gg8FgrCKcnS8p5Tsy/vTmlPdKAL/oKotxa6EfOV19dr4YDAaDsYLgsx0ZS4fY+WLOF4PBYDBWEOx8MZYOw8j50twvBoPBYDBWCex8MZYOnPliMBgMxiqDnS/G0oEJ9wwGg8FYZbDzxVg69Mez6Cc7XwwGg8FYPbDzxVg6xJwvdr4YDAaDsYJg54uxdOBWEwwGg8FYZbDzxVg6aKdrwIR7BoPBYKwg2PliLB004Z4zXwwGg8FYRbDzxVgqzGYSw/hsR+7zxWAwGIzVAztfjKXCMNFYlTNfDAaDwVhFsPPFWCokHS52vhgMBoOximDni7FUSDpcTLhnMBgMxiqCnS/GUiHZ22swYeeLwWAwGKsHdr4YS4XkeY58tiODwWAwVhHsfDGWCjrz1axV4mOGGAwGg8FYJbDzxVgq6PYSZzca8TFDDAaDwWCsEtj5YiwVNOH+9HqDdzsyGAwGYyURxPkSQvyKEOJxIcSXhRB/IIRoCSHuFkI8LIR4UgjxQSFEI4Rsxs0N7XCdWa+z88VgMBiMlQS58yWEuAPALwG4KKV8HYAqgJ8D8BsA3iOlvAfANQDvopbNW9sTiQAAEfBJREFUuPmh20uc2Wgw4Z7BYDAYK4lQZccagDUhRA3AOoAXAPwEgA9Hf38QwNsCyWbcxNDtJc6uNzCczDCbyRO+IgaDwWAwaEHufEkpvwXgnwF4FsrpugHgEQDXpZST6G2XAdxBLZtx80Nnu86s1wEcPW6IwWAwGIxVQIiy4xkA9wK4G8DLAGwAeGvKW4+lNIQQ9wshLgkhLu3t7VFfGuMmgOZ5nVpvHPmdwWAwGIxVQYiy408C+IaUck9KOQbwEQA/COB0VIYEgDsBPL/4QSnlA1LKi1LKi1tbWwEujbHs6I+naNQq2GxW498ZDAaDwVglhHC+ngXwJiHEuhBCAHgzgK8A+ASAt0fvuQ/AnwSQzbjJMRzPsFavolVXzteAnS8Gg8FgrBhCcL4ehiLWfx7AY5GMBwD8DwD+gRDiKQDnALyfWjbj5kd/NEWrXomdL97xyGAwGIxVQ634LfaQUv4agF9bePlpAG8MIY+xOuiPp1irV7HGmS8Gg8FgrCi4wz1jqdAfT9GqV7HWYM4Xg8FgMFYT7HwxlgqD8RRrjWTmi1tNMBgMBmO1wM4XY6kwGE/RqlXRqqupyZkvBoPBYKwa2PliLBX6UeYr3u3IhHsGg8FgrBjY+WIsFQZRq4m47Dhh54vBYDAYqwV2vhhLhf5oiia3mmAwGAzGCoOdL8ZSYRC1moidL+Z8MRgMBmPFwM4XY6mg+3xVKwKNWoWdLwaDwWCsHNj5YiwNpJRxqwkAWKtXMeRWEwwGg8FYMbDzxVgajKYzzCTikmOrXmHOF4PBYDBWDux8MZYGg5HKcmnna61e5bIjg8FgMFYO7Hwxlgba0VqLM1/sfDEYDAZj9cDOF2NpoA/RXmtUop9VPlibwWAwGCsHdr4YSwOd5WrVqvFPdr4YDAaDsWpg54uxNIidL73bscFlRwaDwWCsHtj5YiwN9DmOa0nCPe92ZDAYDMaKgZ0vxtJAn+OYJNwPuM8Xg8FgMFYM7Hwxlgb9hVYTrXqFOV8MBoPBWDkEcb6EEKeFEB8WQnxVCPGEEOIHhBBnhRAfE0I8Gf08E0I24+bFYqsJ7vPFYDAYjFVEqMzXPwfwp1LK7wDwPQCeAPBuAB+XUt4D4OPR7wxGjEFMuD/aakJKeZKXxWAwGAwGKcidLyFEB8CPAHg/AEgpR1LK6wDuBfBg9LYHAbyNWjbj5kbsfCU4XzOpjh1iMBgMBmNVECLz9SoAewB+TwjxqBDifUKIDQAXpJQvAED0czuAbMZNjP7oOOEemB87xGAwGAzGKiCE81UD8AYA75VSfh+AAxiWGIUQ9wshLgkhLu3t7QW4NMYyoz+eolYRqFejsmPkfDHvi8FgMBirhBDO12UAl6WUD0e/fxjKGdsRQtwOANHP3cUPSikfkFJelFJe3NraCnBpjGXGYDyLHS5gfswQ73hkMBgMxiqB3PmSUr4I4DkhxGuil94M4CsAHgJwX/TafQD+hFo24+ZGfzxFM+F86WOGOPPFYDAYjFVCLdD3/lcA/qUQogHgaQDvhHL0PiSEeBeAZwH8TCDZjJsUg/E0znYB82OG2PliMBgMxiohiPMlpfwCgIspf3pzCHmM1UB/ND1adowJ9+x8MRgMBmN1wB3uGUuDwSTD+Zqw88VgMBiM1QE7X4ylQX+0wPnSux251QSDwWAwVgjsfDGWBoNxeuaLOV8MBoPBWCWw88VYGvQXnC99zBA7XwwGg8FYJbDzxVgaDMYzrDWOZ76G7HwxGAwGY4XAzhdjadAfT9GqJ1pNxJwvdr4YDAaDsTpg54uxNBiMprHDBQD1agW1iuCyI4PBYDBWCux8MZYGi5wvQJUe2fliMBgMxiqBnS/GUmA8nWEyk0cyXwDQrFcxGHOrCQaDwWCsDtj5YiwF9OHZxzJfjQofrM1gMBiMlQI7X4ylgC4tthopZUcm3DMYDAZjhcDOF2MpMIxKi2mcLz5eiMFgMBirBHa+GEuBOPNVPzolm5z5YjAYDMaKgZ0vxlJAO1ipmS/mfDEYDAZjhcDOF2Mp0M8i3HOrCQaDwWCsGNj5YiwFBlmE+wa3mmAwGAzGaoGdL8ZSIHa+akedr1a9wpkvBoPBYKwU2PliLAXismNj0fmqYsCEewaDwWCsEII4X0KIqhDiUSHEv41+v1sI8bAQ4kkhxAeFEI0Qchk3L/qj7FYTnPliMBgMxiohVObrlwE8kfj9NwC8R0p5D4BrAN4VSC7jJkVmh/t6FZOZxHjKvC8Gg8FgrAbInS8hxJ0A/haA90W/CwA/AeDD0VseBPA2armMmxv/f3v3H2PZWddx/P2duTO7W4gupQupu11bko2yIcGSSS1WDQETW21Y/oBYgrohmP0HY1EUW/7xR2LUxGA1EpKGVmtCqFgaujFEQ0oJ+IcNU2qAuiKbiu3atTv+KNRyZ+bOna9/nHN3x917Z6Y69zz3nvt+Jc3OOfdMz5M888x+9nm+5zmD2a19l+3zNXjXo9tNSJLaYhwzX/cAHwIGUxWvBl7IzI36+BxweAz31RRb7fWJgH2dy8JXXQPm0qMkqS32NHxFxO3Ahcx8YuvpIZfmiO8/FRHLEbG8srKyl03ThOuu9zmwME81UXrJYBlydd1lR0lSO+z1zNctwNsj4lvAg1TLjfcAByOiU19zBHhu2Ddn5r2ZuZSZS4cOHdrjpmmSrW70Ly4xbjV43ZDvd5QktcWehq/MvDszj2Tm9cAdwOcz8z3AY8A768tOAo/s5X01/brrm1cU28OlmS/f7yhJaoum9vn6deBXIuIsVQ3YfQ3dV1Nitde/4qXasCV8WfMlSWqJzs6X/N9k5heAL9RfPw3cNK57afqt9vpXbLAKlwrufdpRktQW7nCvidDt9a94tRBcet2Q4UuS1BaGL02E7oiZrwNuNSFJahnDlyZCd334046XCu7dakKS1A6GL02EtY3tn3Z02VGS1BaGL02Eaubryh/HweuGXHaUJLWF4UsTodvrD5352teZI8KZL0lSexi+NBG6vf7FbSW2iggOLMy7yaokqTUMXypuczNZH1HzBVXdl68XkiS1heFLxQ2C1bCnHQfnfdpRktQWhi8VN1hSHDXztX9hzpovSVJrGL5U3OBJxpHLjovzPu0oSWoNw5eKW+1VS4r7hmw1AdUrhpz5kiS1heFLxa068yVJmiGGLxV3cdlxyFYTMCi4N3xJktrB8KXidpz5WphnbcOnHSVJ7WD4UnGDWa3RW03MOfMlSWoNw5eKGyw7jgpfBxas+ZIktYfhS8Wt7lTzZcG9JKlF9jx8RcR1EfFYRJyJiKci4s76/NUR8bmI+Gb956v2+t6aToOtJrar+Vrf2GRzM5tsliRJYzGOma8N4IOZ+XrgZuD9EXEcuAt4NDOPAY/Wx9KWZccR+3zVocz3O0qS2mDPw1dmns/Mr9RfvwicAQ4DJ4AH6sseAN6x1/fWdLpYcN8ZPfO19TpJkqbZWGu+IuJ64EbgceC1mXkeqoAGvGac99b0WO312deZY24uhn5+MXxZ9yVJaoGxha+IeCXwaeADmfmdXX7PqYhYjojllZWVcTVNE2a11x9ZbA9VwX11nXt9SZKm31jCV0QsUAWvT2Tmw/Xp5yPi2vrza4ELl39fZt6bmUuZuXTo0KFxNE0TqNvrj1xyBNjfqX5Mfb+jJKkNxvG0YwD3AWcy8yNbPjoNnKy/Pgk8stf31nTq9ja3nfkafOayoySpDTpj+H/eAvwc8LWI+Pv63IeB3wM+FRHvA54B3jWGe2sKddf7IzdYBQvuJUntsufhKzP/FhheOQ1v2+v7afqtbfRHbjMBW7aacOZLktQC7nCv4rrr/ZEbrMKl8OWyoySpDQxfKq7b2z58HVh05kuS1B6GLxXX7fUvbicxjDVfkqQ2MXypuLXe5vZbTdT1YKsb7vMlSZp+hi8V1+31ObC4TcF9x5kvSVJ7GL5U3E4F93Nzwb7OnDVfkqRWMHypqMxkdWP78AVV0b3hS5LUBoYvFbW2sUkm7NshfO3vzLvVhCSpFQxfKmowm7Wbma+uL9aWJLWA4UtFDWaztnu3I1QbrVpwL0lqA8OXilqtZ7N2nPlamGNtw/AlSZp+hi8VNZjN2u7djtXnznxJktrB8KWiBsuO+3ec+bLgXpLUDoYvFbXbgvv9i4YvSVI7GL5U1OouZ772d+ZZ82lHSVILGL5U1G6fdjywOOfMlySpFQxfKmpQRL/z044W3EuS2sHwpaJ2u+w4KLjPzCaaJUnS2DQaviLi1oj4RkScjYi7mry3JtNgn6+dtpoYvH5obcO6L0nSdGssfEXEPPBR4DbgOPDuiDje1P01mV7OVhOAL9eWJE29Jme+bgLOZubTmbkOPAicaPD+mkDdXp+F+WBhfvsfxUFBvkX3kqRp12nwXoeBZ7ccnwN+uMH7X+HOB5/kuxZxF/VPz7+446wXXJr5+rW//OqOT0ZKkrTVtd+7n98+8YbSzbioyfAVQ879r+rpiDgFnAI4evTo2Bv03Atd/nvN8FXSVYsdfuzYNTte98brDnLj0YP8x0vr8FIDDZMktcbcsARSUDT19FhEvBn4zcz8yfr4boDM/N1h1y8tLeXy8nIjbZMkSfr/iIgnMnNpN9c2WfP1ZeBYRNwQEYvAHcDpBu8vSZJUXGPLjpm5ERG/CPwNMA/cn5lPNXV/SZKkSdBkzReZ+Vngs03eU5IkaZK4w70kSVKDDF+SJEkNauxpx5crIlaAf2ngVtcA/97AffTy2C+Ty76ZTPbL5LJvJtNe98v3Z+ah3Vw4seGrKRGxvNtHQ9Uc+2Vy2TeTyX6ZXPbNZCrZLy47SpIkNcjwJUmS1CDDF9xbugEayn6ZXPbNZLJfJpd9M5mK9cvM13xJkiQ1yZkvSZKkBs1s+IqIWyPiGxFxNiLuKt2eWRYR10XEYxFxJiKeiog76/NXR8TnIuKb9Z+vKt3WWRQR8xHxZET8VX18Q0Q8XvfLX9TvalXDIuJgRDwUEf9Yj503O2bKi4hfrn+PfT0iPhkR+x0zZUTE/RFxISK+vuXc0DESlT+uM8FXI+JN42zbTIaviJgHPgrcBhwH3h0Rx8u2aqZtAB/MzNcDNwPvr/vjLuDRzDwGPFofq3l3Ame2HP8+8Id1v/wX8L4irdIfAX+dmT8IvJGqjxwzBUXEYeCXgKXMfAPVe4zvwDFTyp8Bt152btQYuQ04Vv93CvjYOBs2k+ELuAk4m5lPZ+Y68CBwonCbZlZmns/Mr9Rfv0j1l8hhqj55oL7sAeAdZVo4uyLiCPDTwMfr4wDeCjxUX2K/FBAR3wP8OHAfQGauZ+YLOGYmQQc4EBEd4CrgPI6ZIjLzi8B/XnZ61Bg5Afx5Vv4OOBgR146rbbMavg4Dz245PlefU2ERcT1wI/A48NrMPA9VQANeU65lM+se4EPAZn38auCFzNyojx07ZbwOWAH+tF4S/nhEvALHTFGZ+a/AHwDPUIWubwNP4JiZJKPGSKO5YFbDVww552OfhUXEK4FPAx/IzO+Ubs+si4jbgQuZ+cTW00Mudew0rwO8CfhYZt4IvIRLjMXV9UMngBuA7wNeQbWcdTnHzORp9HfbrIavc8B1W46PAM8VaouAiFigCl6fyMyH69PPD6Z96z8vlGrfjLoFeHtEfItqaf6tVDNhB+slFXDslHIOOJeZj9fHD1GFMcdMWT8B/HNmrmRmD3gY+BEcM5Nk1BhpNBfMavj6MnCsfgJlkaog8nThNs2suo7oPuBMZn5ky0engZP11yeBR5pu2yzLzLsz80hmXk81Rj6fme8BHgPeWV9mvxSQmf8GPBsRP1CfehvwDzhmSnsGuDkirqp/rw36xTEzOUaNkdPAz9dPPd4MfHuwPDkOM7vJakT8FNW/4ueB+zPzdwo3aWZFxI8CXwK+xqXaog9T1X19CjhK9UvtXZl5efGkGhARbwF+NTNvj4jXUc2EXQ08CfxsZq6VbN8siogfonoQYhF4Gngv1T+oHTMFRcRvAT9D9RT3k8AvUNUOOWYaFhGfBN4CXAM8D/wG8BmGjJE6LP8J1dOR3wXem5nLY2vbrIYvSZKkEmZ12VGSJKkIw5ckSVKDDF+SJEkNMnxJkiQ1yPAlSZLUIMOXJElSgwxfkiRJDTJ8SZIkNeh/AENrXMxoGakMAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# DFT and plot the results\n",
    "num_sample = 100\n",
    "k0 = 20\n",
    "x = generate_complex_signal(num_sample, k0)\n",
    "\n",
    "X = fft(x)\n",
    "\n",
    "plt.figure(figsize=(10,6))\n",
    "plt.subplot(211)\n",
    "plt.plot(np.real(x))\n",
    "\n",
    "plt.subplot(212)\n",
    "plt.plot(np.real(X))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 实数信号\n",
    "\n",
    "我们生活中遇到的信号都是实数信号，它的定义如下：\n",
    "$$\n",
    "x_2[n] = A_0 \\cos (2\\pi k_0 n/N) = \\frac{A_0}{2}(e^{j2\\pi k_0 n/N} + e^{-j2\\pi k_0 n/N})\n",
    "$$\n",
    "\n",
    "额...虽然生活中的信号都是实数信号，但是上面的式子是对实数信号的超高度浓缩版本，是最简单的版本。实际中的信号模型更为复杂。\n",
    "\n",
    "## 实数信号的DFT\n",
    "\n",
    "将实数信号带入DFT等式中\n",
    "\n",
    "$$\n",
    "\\begin{array}{l}\n",
    "X_2[k] &= \\sum_{n=0}^{N-1} x_2[n] e^{-j2\\pi k n / N} \\\\\n",
    "       &= \\sum_{n=0}^{N-1} \\frac{A_0}{2}(e^{j2\\pi k_0 n/N} + e^{-j2\\pi k_0 n/N}) e^{-j2\\pi k n / N} \\\\\n",
    "       &= \\sum_{n=0}^{N-1} \\frac{A_0}{2}e^{-j2\\pi(k-k_0) n / N} + \\sum_{n=0}^{N-1} \\frac{A_0}{2} e^{-j2\\pi(k+k_0) n / N} \\\\\n",
    "\\end{array}\\tag{2}\n",
    "$$\n",
    "\n",
    "当$k=k_0$或者$k=-k_0$时，(2)式中一项为0，另一项为$N\\frac{A_0}{2}$\n",
    "\n",
    "否则(2)式为0\n",
    "\n",
    "即\n",
    "$$\n",
    "X_2[k] = \n",
    "                        \\begin{cases} \n",
    "                         N\\frac{A_0}{2}, & \\text{if $k = k_0, -k_0$ } \\\\ \n",
    "                         0, & \\text{if $k \\neq k_0$} \n",
    "                        \\end{cases}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 实数信号DFT实例\n",
    "\n",
    "我们将通过代码来展示实数信号的性质，首先生成一段复正弦信号，然后进行DFT，画出结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def generate_real_signal(num_sample, A, k0):\n",
    "    '''\n",
    "    generate real signal\n",
    "    \n",
    "    num_sample : 信号的个数，即公式中的N\n",
    "    A  : 振幅\n",
    "    k0 : 周期个数\n",
    "    \n",
    "    returns\n",
    "    x : 实数信号\n",
    "    '''\n",
    "    hN = num_sample//2\n",
    "    n = np.arange(-hN, hN)\n",
    "    x = A * np.cos( 2*np.pi*k0*n/num_sample )\n",
    "    \n",
    "    return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过打印出结果，我们发现确实有2个峰值，但是并不是$k_0$和$-k_0$\n",
    "\n",
    "其实只要做一次交换就可以，具体请看代码Y的实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/hw/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:19: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "/home/hw/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:20: ComplexWarning: Casting complex values to real discards the imaginary part\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# DFT and plot the results\n",
    "num_sample = 100\n",
    "k0 = 20\n",
    "A = 0.8\n",
    "x = generate_real_signal(num_sample, A, k0)\n",
    "\n",
    "X = fft(x)\n",
    "\n",
    "plt.figure(figsize=(10,6))\n",
    "plt.subplot(311)\n",
    "plt.plot(np.real(x))\n",
    "\n",
    "plt.subplot(312)\n",
    "plt.plot(np.real(X))\n",
    "\n",
    "hM1 = (num_sample+1)//2\n",
    "hM2 = num_sample//2\n",
    "Y = np.zeros(num_sample)\n",
    "Y[:hM1] = X[-hM1:]\n",
    "Y[-hM2:] = X[:hM1]\n",
    "plt.subplot(313)\n",
    "x_axis = np.arange(-hM1, hM2)\n",
    "plt.plot(x_axis, np.real(Y))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
